perm filename PRIM[BNF,JRA]1 blob
sn#005921 filedate 1972-10-12 generic text, type T, neo UTF8
00100 TITLE PRIM
00200 ;ACCUMULATOR DEFINITIONS
00300 P←14
00400 F←15
00500 FF←16
00600
00700 A←1
00800 B←2
00900 C←3
00902 D←4
01000 T←6
01100 R←13
01200 TT←7
01300 NIL←0
01400 INUM0←577777
01500
01600
01700 ;LISP FUNCTION CALL UUO'S
01800 OPDEF CALL [34B8]
01900 OPDEF JCALL [35B8]
02000 OPDEF CALLF [36B8]
02100 OPDEF JCALLF [37B8]
02200
02300 EXTERNAL TRUTH,INTERN,CHRCT,FLATSIZE,ATOM,SCAN,SCNVAL
02400 EXTERNAL NILX,STAR,READP1
02500
02600
02700 NILRET: MOVEI A,NIL
02800 POPJ P,
02900
03000 TRET: MOVEI A,TRUTH
03100 POPJ P,
03200
03300
03400 LOSE: PUSHJ P,UNWIND
03500 NILXR: MOVEI A,NILX ;NILX IS *NIL*
03600 POPJ P,
00100
00200 REDPTR: 0
00300
00400 INTERNAL XXTRY,ATM
00500
00600 ATM: PUSHJ P,LOOK
00700 MOVEI A,INUM0+3
00800 CAIN A,(B) ;IS IT A DELIMITER?
00900 JRST UNWIND ;YES, LOSE
01000 JRST TRY2 ;NO, IT IS AN ATOM -- ACCEPT IT
01100
01200 XXTRY: PUSHJ P,LOOK
01300 CAIE A,(B)
01400 JRST UNWIND
01500 TRY2: SOS BKUPTR
01600 AOS REDPTR
01700 MOVEM B,@REDPTR
01800 JRST TRET
01900
02000 INTERNAL ISIT,ISITN
02100 EXTERNAL ACONS
02200 ISITN: SETOM ISFLG#
02300 JRST .+2
02400 ISIT: SETZM ISFLG#
02500 JUMPE A,NILRET ;IT ISN'T
02600 PUSH P,A ;MAYBE
02700 PUSHJ P,LOOK
02800 HLRZ A,B
02900 HRRZ C,B
03000 CAIN C,INUM0+0
03100 JRST ISIT1
03200 CAIN C,INUM0+1
03300 JRST ISIT4 ;LOSE ON STRINGS
03400 CAIN C,INUM0+2
03500 JRST ISIT1 ;TAKE NUMBERS
03525 CAIE C,INUM0+3
03537 JRST ISIT4 ;LOSE AGAIN
03550 PUSH P,B
03600 PUSHJ P,ACONS-7 ;H.S. TO ASCII
03700 PUSHJ P,INTERN
03750 POP P,B
03800 ISIT1: POP P,D ;NOW MEMQ IT
03900 MOVS C,(D)
04000 CAIN A,(C)
04100 JRST ISIT2 ;IT IS
04200 HLRZ D,C
04300 JUMPN D,ISIT1+1
04350 SKIPN ISFLG
04375 JRST UNWIND
04377 ISIT3: SOS BKUPTR
04379 AOS REDPTR
04381 MOVEM B,@REDPTR
04383 POPJ P,0
04385 ISIT4: POP P,A
04387 JRST UNWIND
04402 ISIT2: SKIPE ISFLG
04404 JRST UNWIND
04406 JRST ISIT3
04408
04500 LOOK: SKIPE B,@BKUPTR
04600 POPJ P,
04700 PUSH P,A
04800 PUSHJ P,SCAN
04900 CAIN A,INUM0
05000 JRST [MOVE A,SCNVAL
05100 PUSHJ P,INTERN
05200 MOVSS A
05300 HRRI A,INUM0
05400 JRST LOOK2]
05500 HRL A,SCNVAL
05600 LOOK2: AOS BKUPTR
05700 MOVEM A,@BKUPTR
05800 MOVE B,A
05900 POP P,A
06000 POPJ P,
06100
06200 INTERNAL SPWDX,CHX
06300 SPWDX: HRLI A,INUM0
06400 JRST .+2
06500 CHX: HRLI A,INUM0+3
06600 MOVSS A
06700 PUSHJ P,LOOK
06800 CAME A,B ;IS BOTH TYPE AND VALUE THE SAME?
06900 JRST UNWIND ;NO, LOSE
07000 JRST TRY2 ;YES, TAKE IT
07100
00100 INTERNAL STK,PDLSET
00200
00300 STK: MOVNI A,-INUM0(A) ;THIS SHOULD BE NEGATIVE NUMVAL
00400 ADD A,REDPTR ;0 IS THE TOP OF THE STACK
00500 HLRZ A,(A) ;THE SEMANTIC VALUE IS IN THE LEFT HALF
00600 POPJ P,
00700
00800 ;PDLSET INITIALIZES PDLPTR TO POINT TO A LISP ARRAY
00900
01000 PDLSET: ADDI B,12
01100 ADDI A,12 ;GET ADDRESSES OF 1ST ARRAY WORDS
01200 MOVEM A,REDPTR
01300 MOVEM B,BKUPTR
01400 SETZM @BKUPTR
01500 JRST MARK
00100
00200
00300 INTERNAL REDUCE
00400 ;REDUCE RESETS TO STACK TO BELOW THE MARK
00500 ;A CONTAINS SYNTACTIC VALUE, B CONTAINS SEMANTIC VALUE
00600 REDUCE: PUSHJ P,UNMARK ;RESET STACK TO BELOW MARK
00700 CAIN B,NILX ;IS SEMANTIC VALUE *NIL*?
00800 JRST UNWIND ;YES, UNWIND STACK TO PREVIOUS MARK
00900 HRL A,B ;NO, CONSTRUCT REDUCTION WORD
01000 AOS REDPTR
01100 MOVEM A,@REDPTR ;PUSH IT ONTO REDUCTION STACK
01200 JRST TRET
01300
01400 UNMARK: HRRO T,REDMRK#
01500 POP T,REDMRK ;RESTORE REDMRK TO ITS PREVIOUS VALUE
01600 HRRZM T,REDPTR ;RESTORE REDPTR TO BELOW REDMRK
01700 POPJ P,
01800
01900 MARK: HRRZ T,REDPTR
02000 PUSH T,REDMRK ;SAVE REDMRK
02100 HRROM T,REDMRK ;REMEMBER WHERE REDMRK SAVED
02200 HRRZM T,REDPTR ;UPDATE REDPTR
02300 JRST NILRET ;PDL OVERFLOW CHECKING HERE?
02400
02500 UNWIND: HRRO T,REDPTR
02600 SKIPA TT,BKUPTR#
02700 UNWIN2: PUSH TT,A
02800 POP T,A ;GET A WORD FROM REDUCTION PDL
02900 TLC A,-1
03000 TLCE A,-1
03100 JRST UNWIN2 ;IF NOT A MARK, TRANSFER IT TO BACKUP PDL
03200 PUSH T,A ;FOUND A MARK, RESTORE IT
03300 HRRZM T,REDPTR ;AND UPDATE POINTERS
03400 HRRZM TT,BKUPTR
03500 JRST NILRET ;PDL OVERFLOW CHECKING HERE?
03600
00100
00200
00300 ISSTR: MOVE B,@BKUPTR ;GET TOP OF BACKUP STACK
00400 CAIE A,(B) ;IS IT THE PROPER TYPE?
00500 JRST MARK ;NO, PROCEED WITH RULE
00600 SOS BKUPTR ;YES, TRANSFER IT TO REDUCTION PDL
00700 AOS REDPTR
00800 MOVEM B,@REDPTR
00900 JRST TRET
00100
00200
00300 INTERNAL LRR,NLRR
00400
00500 ;LRR--LEFT RECURSIVE RULE
00600 ;A CONTAINS NAME OF RULE
00700 ;B CONTAINS NON LEFT-RECURSIVE FUNCTION
00800 ;C CONTAINS LEFT-RECURSIVE FUNCTION
00900
01000 LRR: PUSH P,A ;SAVE NAME
01100 PUSH P,B ;SAVE FUNCTIONS
01200 PUSH P,C
01300 PUSHJ P,ISSTR ;IS A REDUCTION ALREADY MADE?
01400 JUMPN A,LRRXIT ;YES
01500 CALLF @-1(P) ;NO, EXECUTE NON LEFT-RECURSIVE FUNCTION
01600 MOVEM A,-1(P) ;SAVE SEMANTIC VALUE
01700 LRRL: CAIN A,NILX ;IS IT *NIL*?
01800 JRST LRRRET ;YES
01900 MOVEM A,-1(P) ;NO, SAVE SEMANTIC VALUE
02000 PUSHJ P,UNMARK ;RESET STACK TO MARK
02100 PUSHJ P,MARK
02200 HRRZ A,-1(P) ;GET SEMANTIC VALUE
02300 CALLF 1,@(P) ;EXECUTE LEFT-RECURSIVE FUNCTION
02400 JRST LRRL ;CONTINUE UNTIL FAILURE
02500
02600 LRRRET: MOVE B,-1(P) ;GET FINAL SEMANTIC VALUE
02700 MOVE A,-2(P) ;GET NAME OF RULE(SYNTACTIC VALUE)
02800 PUSHJ P,REDUCE ;PERFORM THE REDUCTION
02900
03000 LRRXIT: SUB P,[XWD 3,3] ;RESYNC THE STACK
03100 POPJ P,
03200
03300 ;NLRR---NON LEFT-RECURSIVE RULE
03400 ;A CONTAINS NAME OF RULE
03500 ;B CONTAINS FUNCTION
03600
03700 NLRR: PUSH P,A ;SAVE NAME
03800 PUSH P,B ;SAVE FUNCTION
03900 PUSHJ P,ISSTR ;IS THE REDUCTION ALREADY MADE?
04000 JUMPN A,NLRXIT ;YES
04100 POP P,A ;NO, GET FUNCTION
04200 CALLF (A) ;CALL FUNCTION
04300 POP P,B ;GET SYNTACTIC VALUE
04400 EXCH A,B
04500 JRST REDUCE ;PERFORM THE REDUCTION
04600
04700 NLRXIT: SUB P,[XWD 2,2] ;RESYNC STACK
04800 POPJ P,
04900
05000
00100
00200 INTERNAL PPOS,LOC,FLATC
00300 EXTERNAL TYO,CHRCT,TERPRI,CHCT,LINL
00400
00500 PPOS: SUBI A,INUM0
00600 JUMPE A,TERPRI
00700 MOVEI C,(A)
00800 MOVE A,LINL
00900 SUB A,CHCT
01000 CAMGE C,A
01100 PUSHJ P,TERPRI
01200 JRST PPOS2
01300
01400 PPOS22: MOVEI A,11
01500 PUSHJ P,TYO
01600 PPOS2: MOVE B,LINL
01700 SUB B,CHCT
01800 CAIL C,8(B)
01900 JRST PPOS22
02000 SUB C,B
02100 MOVEI A,40
02200 JRST .+2
02300 PUSHJ P,TYO
02400 SOJGE C,.-1
02500 POPJ P,
02600
02700 LOC: MOVE A,LINL
02800 SUB A,CHCT
02900 ADDI A,INUM0
03000 POPJ P,
03100
03200 FLATC: HRROI R,FLATSIZE+5
03300 HLLZS FLATSIZE+3
03400 JRST FLATSIZE+2
03500
00100
00200 INTERNAL OUTRULE,MATCH
00300
00400 PDLPTR←←REDPTR
00500 OUTRULE: MOVE T,PDLPTR
00600 MOVNI A,-INUM0(A) ;SHOULD BE NEGATIVE NUMVAL
00700 ADDI A,(T)
00800 PUSH P,A
00900 PUSH T,(A)
01000 PUSH T,PDLMARK#
01100 MOVEM T,PDLMARK
01200 MOVEM T,PDLPTR
01300 CALLF (B)
01400 MOVE T,PDLMARK
01500 POP T,PDLMARK
01600 POP T,B
01700 POP P,B ;SHOULD BE PTR TO X.
01800 MOVEM T,PDLPTR
01900 JUMPN A,OR1
02000 MOVE T,PDLMARK
02100 MOVEM T,PDLPTR
02200 POPJ P,
02300
02400 OR1: HRLZM A,(B)
02500 POPJ P,
00100
00200 MATCH: MOVE T,PDLMARK
00300 MOVE B,A
00400 HLRZ A,-1(T)
00500 MOVEM P,PSAV#
00600 PUSHJ P,MAT
00700 MOVEM T,PDLPTR
00800 JRST TRET
00900
01000 MAT: CAIN B,STAR
01100 JRST MAT1
01200 PUSH P,A
01300 PUSH P,B
01400 CALL 1,ATOM
01500 JUMPN A,MAT2
01600 MOVE A,(P)
01700 CALL 1,ATOM
01800 JUMPN A,MAT2
01900 HLRZ A,@-1(P)
02000 HLRZ B,@(P)
02100 PUSHJ P,MAT
02200 HRRZ A,@-1(P)
02300 HRRZ B,@(P)
02400 SUB P,[XWD 2,2]
02500 JRST MAT
02600
02700 MAT1: HRLZS A
02800 PUSH T,A
02900 POPJ P,
03000
03100 MAT2: POP P,B
03200 POP P,A
03300 CAMN A,B
03400 POPJ P,
03500
03600 MAT3: MOVE P,PSAV
03700 JRST NILRET
03800
00100
00200 END